package org.gjy.m8.concurrent.cf;

import java.util.concurrent.*;

/**
 * @author gjy
 * @version 1.0
 * @since 2025-10-09 14:36:36
 */
public class Cf2Test {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        try {

            // 创建任务
            Callable<String> task = () -> {
                // 模拟耗时任务
                System.out.println("任务开始执行...");
                Thread.sleep(2000); // 模拟2秒的处理时间
                System.out.println("任务执行完成");
                return "任务执行成功";
            };

            // 执行带超时的任务
            String result = executeTaskWithTimeout(executor, 1, TimeUnit.SECONDS, task);
            System.out.println("任务执行结果: " + result);
        } catch (TimeoutException e) {
            System.out.println("任务超时被取消");
        } catch (Exception e) {
            System.out.println("任务执行异常: " + e.getMessage());
        } finally {
            executor.shutdown();
        }

    }

    public static <T> T executeTaskWithTimeout(ExecutorService executor, long timeout, TimeUnit unit, Callable<T> task) throws Exception {
        // 提交任务并获取Future
        Future<T> future = executor.submit(task);
        try {
            // 在指定时间内获取结果
            return future.get(timeout, unit);
        } catch (TimeoutException e) {
            // 超时，取消任务
            future.cancel(true); // true表示中断正在执行的任务
            throw e;
        } catch (Exception ae) {
            throw ae;
        }
    }

}
